package com.restkeeper.utils.device;

import com.alibaba.fastjson.JSONObject;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;

public class SignatureUtil {



    /**
     * 根据提供的参数和密钥生成签名。
     *
     * @param jsonObject 参数列表（JSONObject类型）。
     * @param key        用于签名的API密钥。
     * @return 生成的签名（大写形式）。
     */
    public static String generateSignature(JSONObject jsonObject, String key) {
        // 将JSONObject转换为Map
        Map<String, String> params = new TreeMap<>();
        jsonObject.keySet().forEach(k -> {
            Object value = jsonObject.get(k);
            if (value != null) {
                params.put(k, value.toString());
            }
        });

        // 第一步：过滤掉空值参数，并按照ASCII字典序排序
        String stringA = params.entrySet().stream()
                .filter(entry -> entry.getValue() != null && !entry.getValue().isEmpty())
                .sorted(Map.Entry.comparingByKey())
                .map(entry -> entry.getKey() + "=" + entry.getValue())
                .collect(Collectors.joining("&"));

        // 第二步：拼接密钥
        String stringSignTemp = stringA + "&key=" + key;
        // 第三步：执行MD5加密并转换为大写
        return md5(stringSignTemp).toUpperCase();
    }


    /**
     * 计算字符串的MD5哈希值。
     *
     * @param input 要计算哈希值的字符串。
     * @return MD5哈希值的十六进制字符串。
     */
    private static String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
            // 将字节数组转换为十六进制字符串
            StringBuilder hexString = new StringBuilder();
            for (byte b : digest) {
                String hex = Integer.toHexString(0xFF & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5算法不可用", e);
        }
    }

//    public static void main(String[] args) {
//        // 示例使用
//        Map<String, String> params = new TreeMap<>();
//        params.put("method", "xkwei.iccid.queryOne");
//        params.put("timestamp", "1660479478000");
//        params.put("requestNo", "240155126464513");
//        params.put("userCode", "Z1536586669107555");
//        params.put("iccid", "89860621330024858020");
//
//        String apiKey = "8zhd73s8djdfbxh3h37dn1js";
//        String sign = generateSignature(params,apiKey);
//
//        System.out.println("生成的签名: " + sign);
//    }
}
